package day04;

/*
练习：
圆类：Circle，属性：r 设置为私有的
              方法：周长 zc，面积 mj，构造方法，get/set方法，toString方法

圆柱类：YuanZhu，从圆类继承。
              属性：h 高，设置为私有的
              方法：面积 mj（重写父类的mj），体积 tj，构造方法，get/set方法，toString方法

继承：extends关键字实现
      只能从一个类继承，也就是只能有一个父类，可以多层继承。比如宠物狗从宠物类继承，宠物类从动物类继承。
      没有写从哪个类继承，默认是从Object类继承的。
      继承了父类的属性和方法，不继承构造方法。
      子类可以重写父类同名的方法，子类也可以有自己的属性和方法。

设计类的时候：
     有哪些属性
     构造方法给哪些属性赋值
     哪些属性加get/set方法
     加不加toString方法
     ……
     根据业务的需求，设计出来的。
 */
public class Demo03 {
    public static void main(String[] args) {
        Circle c1 = new Circle(5);
        System.out.println(c1);
        System.out.println("周长=" + c1.zc());
        System.out.println("面积=" + c1.mj());

        YuanZhu y1 = new YuanZhu(5, 10);
        System.out.println(y1);
        System.out.println("体积=" + y1.tj());
        System.out.println("表面积=" + y1.mj());
    }
}

class Circle {
    private int r;

    public Circle(int r) {
        this.r = r;
    }

    public int getR() {
        return r;
    }

    public void setR(int r) {
        this.r = r;
    }

    // 周长
    public double zc() {
        return Math.PI * 2 * r; //3.14 * 2 * r;
    }

    // 面积
    public double mj() {
        return Math.PI * r * r;
    }

    @Override
    public String toString() {
        return "Circle{" +
                "r=" + r +
                '}';
    }
}

class YuanZhu extends Circle {
    private int h;// 高

    public YuanZhu(int r, int h) {
        super(r);
        this.h = h;
    }

    public int getH() {
        return h;
    }

    public void setH(int h) {
        this.h = h;
    }

    // 重写父类的mj方法，表面积=圆周长*高+底面积*2
    public double mj() {
        return super.zc() * h + super.mj() * 2;
    }

    // 体积=底面积*高
    public double tj() {
        return super.mj() * h;
    }

    @Override
    public String toString() {
        return "YuanZhu{" +
                "h=" + h +
                "}, 表面积=" + mj() + ", 体积=" + tj()
                + super.toString();
    }
}